package com.yubest.junit.generic;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;

/**
 * 泛型接口
 *
 * @Author: hweiyu
 * @Date: 2022/10/28 12:09
 */
public abstract class Generic<T> {

    public TypeInfo getTarget() {
        Type superClass = this.getClass().getGenericSuperclass();
        Type type = ((ParameterizedType)superClass).getActualTypeArguments()[0];
        TypeInfo typeInfo = new TypeInfo();
        wrapTypeInfo(type, typeInfo);
        return typeInfo;
    }

    private void wrapTypeInfo(Type type, TypeInfo typeInfo) {
        typeInfo.setType(type);
        typeInfo.setParams(new ArrayList<>());
        if (type instanceof ParameterizedType) {
            for (Type argType : ((ParameterizedType) type).getActualTypeArguments()) {
                TypeInfo argTypeInfo = new TypeInfo();
                wrapTypeInfo(argType, argTypeInfo);
                typeInfo.getParams().add(argTypeInfo);
            }
        }
    }
}
